package logger

import (
	"fmt"
	"log"
	"os"
	"path/filepath"
	"runtime"
	"strings"
	"time"
)

var (
	// 定义日志级别
	levelDebug = "debug"
	levelInfo  = "info"
	levelWarn  = "warn"
	levelError = "error"
	levelFatal = "fatal"

	// 当前日志级别
	currentLevel = levelInfo

	// 日志文件
	logFile *os.File
)

// InitLogger 初始化日志系统
func InitLogger(level string) {
	// 设置日志级别
	if level != "" {
		currentLevel = strings.ToLower(level)
	}

	// 创建日志目录
	err := os.MkdirAll("logs", 0755)
	if err != nil {
		log.Printf("创建日志目录失败: %v", err)
	}

	// 打开日志文件
	logPath := filepath.Join("logs", fmt.Sprintf("%s.log", time.Now().Format("2006-01-02")))
	logFile, err = os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		log.Printf("打开日志文件失败: %v", err)
	}
}

// Debug 调试级别日志
func Debug(format string, args ...interface{}) {
	if shouldLog(levelDebug) {
		writeLog(levelDebug, format, args...)
	}
}

// Info 信息级别日志
func Info(format string, args ...interface{}) {
	if shouldLog(levelInfo) {
		writeLog(levelInfo, format, args...)
	}
}

// Warn 警告级别日志
func Warn(format string, args ...interface{}) {
	if shouldLog(levelWarn) {
		writeLog(levelWarn, format, args...)
	}
}

// Error 错误级别日志
func Error(format string, args ...interface{}) {
	if shouldLog(levelError) {
		writeLog(levelError, format, args...)
	}
}

// Fatal 致命错误日志
func Fatal(format string, args ...interface{}) {
	if shouldLog(levelFatal) {
		writeLog(levelFatal, format, args...)
		os.Exit(1)
	}
}

// shouldLog 判断是否应该记录该级别的日志
func shouldLog(level string) bool {
	switch currentLevel {
	case levelDebug:
		return true
	case levelInfo:
		return level != levelDebug
	case levelWarn:
		return level != levelDebug && level != levelInfo
	case levelError:
		return level == levelError || level == levelFatal
	case levelFatal:
		return level == levelFatal
	default:
		return true
	}
}

// writeLog 写入日志
func writeLog(level, format string, args ...interface{}) {
	// 获取调用者信息
	_, file, line, ok := runtime.Caller(2)
	if !ok {
		file = "unknown"
		line = 0
	}

	// 格式化日志内容
	message := fmt.Sprintf(format, args...)
	timestamp := time.Now().Format("2006-01-02 15:04:05")

	// 简化文件路径
	file = filepath.Base(file)

	// 格式化日志行
	logLine := fmt.Sprintf("[%s] [%s] [%s:%d] %s\n", timestamp, strings.ToUpper(level), file, line, message)

	// 同时输出到控制台和文件
	fmt.Print(logLine)
	if logFile != nil {
		if _, err := logFile.WriteString(logLine); err != nil {
			log.Printf("写入日志文件失败: %v", err)
		}
	}
}
